#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

/*

顺序表，全名顺序存储结构，是线性表的一种

顺序表存储数据时，会提前申请一块足够大小的内存，然后将数据依次
存储起来，存储时做到数据元素之间不留一丝缝隙
1、要申请足够大小的内存
2、申请的存储容量
3、存储数据元素的个数

*/

typedef struct
{
	int* head;  //指针，存申请的内存的首地址
	int length; //当前数据个数
	int size;   //元素个数（最大容量）
}Table;

void expTable(Table* p)
{
    (*p).head=realloc((*p).head,((*p).size *=2)*sizeof(int));
    if(!(*p).head) 
    {
        printf("内存扩容失败！程序终止！\n");
        exit(0);
    }
}

Table initTable()
{
	Table t;
	//1、记录最大容量
	t.size=5;
	//2、记录数据个数
	t.length=0;
	//3、申请内存
	t.head=(int*)calloc(t.size,sizeof(int));
	if(!t.head)
	{
		printf("申请内存失败！程序终止！\n");
		exit(0);
	}

	return t;

}

void inputTable(Table* p,int num)
{
    if(num<1)
    {
        printf("长度错误！\n");
    }
    else if(num<=(*p).size)
    {
        for(int i=0;i<num;i++)
        {
            scanf("%d",(*p).head+i);
            (*p).length++;
        }
    }
    else
    {
        //扩容
        expTable(p);

        for(int i=0;i<num;i++)
        {
            scanf("%d",(*p).head+i);
            (*p).length++;
        }
    }

}

void displayTable(Table table)
{
    printf("\n");
    printf("size:%d ",table.size);
	printf("length:%d ",table.length);
	printf("head:%X\n",table.head);
    for(int i=0;i<table.length;i++)
	{
		//printf("%d ",*(table.head++));
        printf("%d ",table.head[i]);
	}
    printf("\n");
}

Table addTable(Table* p,int val,int index)
{
    if(index<1 || (*p).length+1<index)
    {
        printf("位置错误，插入失败！\n");
        return *p;
    }
    if((*p).length>=(*p).size)
    {
        //扩容
        expTable(p);
    }

    for(int i=(*p).length-1;i>=index-1;i--)
    {
        (*p).head[i+1]=(*p).head[i];

    }
    (*p).head[index-1]=val;
    (*p).length++;
    return *p;
}

Table delTable(Table* p,int index)
{
    if(1 > index || index > p->length)
    {
        printf("删除位置错误！删除失败\n");
        return *p;
    }
    for(int i=index;i < p->length;i++)
    {
        p->head[i-1]=p->head[i];
    }
    p->length--;
    return *p;
}

int selectTable(Table table,int val)
{
    for(int i=0;i<table.length;i++)
    {
        if (table.head[i]==val)
        {
            return i+1;
        }
        
    }
    return -1;
}

Table changeTable_1(Table table,int val,int index)
{
    if(1 > index || index > table.length)
    {
        printf("修改位置错误！修改失败\n");
        return table;
    }

    table.head[index-1]=val;
    return table;
}

Table changeTable_2(Table table,int val,int newVal)
{
    int index=selectTable(table,val);
    if(1 > index || index > table.length)
    {
        printf("修改位置错误！修改失败\n");
        return table;
    }
    table.head[index-1]=newVal;
    return table;
}

int main()
{
	Table myTab=initTable();
	printf("MyTab.size:%d\n",myTab.size);
	printf("MyTab.length:%d\n",myTab.length);
	printf("MyTab.head:%X\n",myTab.head);

    /*
	for(int i=0;i<3;i++)
	{
		myTab.head[i]=10+i;
        myTab.length++;
	}
    */

    inputTable(&myTab,8);

    displayTable(myTab);

    displayTable(addTable(&myTab,6,3));

    displayTable(delTable(&myTab,6));

    int index=selectTable(myTab,7);
    printf("index=%d\n",index);

    displayTable(changeTable_1(myTab,99,3));
    Table t=changeTable_1(myTab,100,4);
    displayTable(t);
    displayTable(myTab);


    Table t1=changeTable_2(myTab,6,101);
    displayTable(t1);

	system("pause");
	return 0;
} 